/*
 * Copyright 2002-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.beans.factory.config;

import org.springframework.beans.BeansException;

/**
 * BeanFactoryPostProcessor 的机制，
 * 就相当于给了我们在 Bean 实例化之前最后一次修改 BeanDefinition 的机会，
 * 我们可以利用这个机会对 BeanDefinition 来进行一些额外的操作，
 * 比如更改某些 bean 的一些属性，给某些 Bean 增加一些其他的信息等等操作。
 *
 * @author Juergen Hoeller
 * @author Sam Brannen
 * @see BeanPostProcessor
 * @see PropertyResourceConfigurer
 * @since 06.07.2003
 */
@FunctionalInterface
public interface BeanFactoryPostProcessor {

	/**
	 * 1、表示了该方法的作用：在 standard initialization之后（已经就是已经完成了 BeanDefinition 的加载）对 bean factory 容器进行修改。
	 * 其中参数 beanFactory 应该就是已经完成了 standard initialization 的 BeanFactory 。
	 * <p>
	 * 2、表示作用时机：所有的 BeanDefinition 已经完成了加载即加载至 BeanFactory 中，但是还没有完成初始化。
	 * <p>
	 * <p>
	 * #postProcessBeanFactory(...) 方法，工作于 BeanDefinition 加载完成之后，Bean 实例化之前，
	 * 其主要作用是对加载 BeanDefinition 进行修改。
	 * 有一点需要需要注意的是在 #postProcessBeanFactory(...) 方法中，
	 * 千万不能进行 Bean 的实例化工作，因为这样会导致 Bean 过早实例化，
	 * 会产生严重后果，我们始终需要注意的是 BeanFactoryPostProcessor
	 * 是与 BeanDefinition 打交道的，如果想要与 Bean 打交道，请使用 BeanPostProcessor
	 */
	void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}
